package StudentManagerSystem1;

import java.io.*;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Login {
    public Login() throws IOException {
        //创建一个用户列表
        ArrayList<User> userList = new ArrayList<>();
        //调用readerFile方法读取文件中的用户信息
        readerFile(userList);
        //调用login方法进行登录验证
        login(userList);

    }




    private void login(ArrayList<User> userList) throws IOException {
        //创建一个scanner对象，用于接收用户输入
        Scanner s = new Scanner(System.in);
        //定义变量，用于接收用户输入的用户名
        String loginName;
        //输出提示信息，要求用户输入用户名
        System.out.println("请输入用户名：");
        //将用户输入的内容赋值给loginName变量
        loginName = s.nextLine();
        //调用checkName方法，检查用户输入的用户名是否存在
        boolean flag = checkName(loginName,userList);
        //如果用户输入的用户名不存在，输出提示信息，并返回
        if (!flag) {
            System.out.println("用户名不存在，请重新输入或者注册！");
            return;
        }
        //输出提示信息，要求用户输入密码
        System.out.println("请输入密码：");
        //将用户输入的内容赋值给loginPassword变量
        String loginPassword = s.nextLine();
        //验证码
        Code code = new Code();
        //调用abs方法，让用户输入验证码
        abs(s, code);
        //调用checkPassword方法，检查用户输入的密码是否正确
        boolean flag2 = checkPassword(loginName,loginPassword,userList);
        //循环三次，让用户输入密码，如果用户输入的密码正确，则输出提示信息，并结束循环
        for (int i = 1; i < 3; i++) {
            if (flag2) {
                System.out.println("登录成功");
                //调用new StudentMangerSystem()方法，创建一个StudentMangerSystem对象
                new StudentMangerSystem();
                //跳出循环
                break;
            } else {
                System.out.println("密码错误，请重新输入,你还有"+ (3-i)+"次机会");
                //重新输出提示信息，要求用户输入密码
                System.out.println("请输入密码：");
                //将用户输入的内容赋值给loginPassword变量
                loginPassword = s.nextLine();
                //调用abs方法，让用户输入验证码
                abs(s, code);
                //调用checkPassword方法，检查用户输入的密码是否正确
                flag2 = checkPassword(loginName,loginPassword,userList);
                //如果循环次数达到两次，则输出提示信息，并结束循环
                if (i== 2) {
                    System.out.println("账号已锁定！请选择忘记密码！");
                    //遍历userList，找到用户名相同的用户，并设置密码为随机密码
                    for (User user : userList) {
                        if (user.getName().equals(loginName)) {
                            String passWord = user.getPassWord();
                            //获取密码长度
                            int len = passWord.length();
                            //生成随机密码
                            String randomPass = randomPassword(len);
                            //设置用户密码
                            user.setPassWord(randomPass);
                            //调用writerFile方法，将用户列表写入文件
                            writerFile(userList);
                        }
                    }
                }
            }
        }
    }

   // 生成随机密码
 private String randomPassword(int len) {
        // 创建一个Random对象
        Random r = new Random();
        // 创建一个StringBuilder对象，用于存放随机密码
        StringBuilder passWord = new StringBuilder();
        // 循环指定长度
        for (int i = 0; i < len; i++) {
            // 生成一个0-9的随机数
            int num = r.nextInt(10);
            // 将随机数添加到密码中
            passWord.append(num);
        }
        // 返回随机密码
        return passWord.toString();
    }

    private void abs(Scanner s, Code code) {
        // 循环验证输入的验证码是否正确，直到正确为止
        while (true) {
            // 获取验证码
            String loginCode = code.code();
            // 输出正确的验证码
            System.out.println("正确的验证码为：" + loginCode);
            // 输出请输入验证码的提示
            System.out.println("请输入验证码：");
            // 获取输入的验证码
            String inputCode = s.nextLine();
            // 比较输入的验证码是否与正确的验证码一致，忽略大小写
            boolean flag = loginCode.equalsIgnoreCase(inputCode);
            // 如果一致，结束循环
            if (flag) {
                break;
            } else {
                // 如果不一致，输出验证码错误提示
                System.out.println("验证码错误");
            }
        }
    }

    //判断密码是否正确
    //检查用户名和密码是否正确
 private boolean checkPassword(String loginName,String loginPassword,ArrayList<User> userList) {
        //遍历用户列表
        for (User user : userList) {
            //比较用户名和密码是否相等
            if (user.getName().equals(loginName) && user.getPassWord().equals(loginPassword)) {
                //相等返回true
                return true;
            }
        }
        //没有相等的用户名和密码，返回false
        return false;
    }

    //将集合中的用户信息写入文件
    // 向文件user.txt写入用户列表
 private void writerFile(ArrayList<User> userList) throws IOException {
        // 创建BufferedWriter对象，用于写入文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt",true));
        // 遍历用户列表
        for (User user : userList) {
            // 将用户信息写入文件
            bw.write(user.toString());
            // 换行
            bw.newLine();
            // 刷新缓冲区
            bw.flush();
        }
        // 关闭BufferedWriter对象
        bw.close();
    }
    //将文件中的注册信息写出
    // 读取文件内容，并将用户信息添加到userList中
private void readerFile(ArrayList<User> userList) throws IOException {
        // 使用FileReader读取文件内容
        BufferedReader br = new BufferedReader(new FileReader("user.txt"));
        // 读取每一行内容
        String line;
        while ((line= br.readLine())!=null) {
            // 根据-分割字符串
            String[] str = line.split("-");
            // 创建User对象，并将分割后的内容添加到User对象中
            User user = new User(str[0],str[1],str[2],str[3]);
            userList.add(user);
        }
        // 关闭文件
        br.close();
    }

    //验证用户名是否注册
    //检查用户名是否已存在
 private boolean checkName(String name,ArrayList<User> userList) {
        //遍历用户列表
        for (User userName : userList) {
            //比较用户名是否相等
            if (userName.getName().equals(name)) {
                //如果相等，返回true
                return true;
            }
        }
        //如果没有相等的用户名，返回false
        return false;
    }
}
